package com.study.springCustom.spring.factory.support;

import com.study.springCustom.spring.factory.AutowireCapableBeanFactory;
import com.study.springCustom.spring.ioc.BeanDefinition;
import com.study.springCustom.spring.registry.DefaultSingletonBeanRegistry;

// 职责：制定整个getBean的流程
public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements AutowireCapableBeanFactory {

    @Override
    public Object getBean(String name) {
        // 1、先查询缓存中有没有
        Object bean = getSingleton(name);
        // 2、有则直接返回
        if (bean != null) {
            return bean;
        }
        // 3、没有则查询对应的BeanDefinition准备创建对象
        BeanDefinition bd = getBeanDefinition(name);
        if (bd == null) {
            return null;
        }
        // 4、判断是单例还是多例（在bean标签中可以通过一个标识去区别）
        /*if ("singleton".equals(bd.getScope())){

        }else if("prototype".equals(bd.getScope())){

        }*/
        if (bd.isSingleton()){
            // 5、触发创建单例Bean实例的流程
            bean = createBean(bd);
            // 6、将单例Bean实例放入Map集合中
            addSingleton(name,bean);
        }else if(bd.isPrototype()){
            bean = createBean(bd);
        }
        return bean;
    }

    // 延迟到子类去实现
    protected abstract Object createBean(BeanDefinition bd);

    // 延迟到子类去实现
    protected abstract BeanDefinition getBeanDefinition(String name);
}
